package be.groept.ace.cursusplanning.model.containers;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import be.groept.ace.cursusplanning.model.Cursist;
import be.groept.ace.cursusplanning.model.Inschrijving;
import be.groept.ace.cursusplanning.utils.observer.EventArgs;
import be.groept.ace.cursusplanning.utils.observer.PropertyChanged;
import be.groept.ace.cursusplanning.utils.observer.Subject;
import be.groept.ace.cursusplanning.utils.observer.Subscriber;

public class Inschrijvingen implements Container<Inschrijving, Integer> {

	private List<Inschrijving> inschrijvingen;
	
	private Subject<Inschrijving[]> inschrijvingenVoorCursistSubject;
	private Subject<Inschrijving[]> geselecteerdeInschrijvingSubject;
	
	public Inschrijvingen() {
		inschrijvingen = new ArrayList<Inschrijving>();
		inschrijvingenVoorCursistSubject = new PropertyChanged<Inschrijving[]>();
		geselecteerdeInschrijvingSubject = new PropertyChanged<Inschrijving[]>();
	}
	
	@Override
	public void add(Inschrijving inschrijving) throws IllegalArgumentException{
		if(inschrijving == null) throw new IllegalArgumentException("Inschrijving mag niet null zijn.");
		if(inschrijvingen.contains(inschrijving)) throw new IllegalArgumentException("Deze inschrijving bestaat al.");
		inschrijvingen.add(inschrijving);
	}

	@Override
	public Inschrijving get(Integer index ) throws IllegalArgumentException{
		if(index == null) throw new IllegalArgumentException("index mag nie tnull zijn");
		try {
			return inschrijvingen.get(index);
		}catch (IndexOutOfBoundsException e) {
			throw new IllegalArgumentException("index niet gevonden");
		}
		
	}

	@Override
	public List<Inschrijving> getAll() {
		return inschrijvingen;
	}

	@Override
	public void remove(Integer index) throws IllegalArgumentException {
		if(index == null) throw new IllegalArgumentException("key mag niet null zijn.");
		try {
			inschrijvingen.remove(inschrijvingen.get(index));
		}catch (IndexOutOfBoundsException e) {
			throw new IllegalArgumentException("index niet gevonden.");
		}
	}

	@Override
	public Iterator<Inschrijving> iterator() {
		return inschrijvingen.iterator();
	}

	public void addInschrijvingenVoorCursistSubscriber(Subscriber<Inschrijving[]> subscriber) {
		inschrijvingenVoorCursistSubject.addSubscriber(subscriber);
	}
	
	public void fireInschrijvingenVoorCursist(Cursist cursist) {
		inschrijvingenVoorCursistSubject.notifySubscribers(new EventArgs<Inschrijving[]>(getInschrijvingenVoorCursist(cursist)));
	}
	
	public Inschrijving[] getInschrijvingenVoorCursist(Cursist cursist) {
		List<Inschrijving> inschrijvingenVoorCursist = new ArrayList<Inschrijving>();
		int i = 0;
		for(Inschrijving inschrijving : getAll()) {
			if(inschrijving.getCursist().equals(cursist)) {
				inschrijvingenVoorCursist.add(inschrijving);
			}
		}
		return inschrijvingenVoorCursist.toArray(new Inschrijving[inschrijvingenVoorCursist.size()]);
	}
	
	public void addgeselecteerdeInschrijvingSubscriber(Subscriber<Inschrijving[]> subscriber) {
		geselecteerdeInschrijvingSubject.addSubscriber(subscriber);
	}
	
	public void fireGeselecteerdeInschrijving(Inschrijving[] geselecteerdeInschrijving) {
		geselecteerdeInschrijvingSubject.notifySubscribers(new EventArgs<Inschrijving[]>(geselecteerdeInschrijving));
	}
}
